﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using FastFood.Business.Entities;
using System.Data;
using Microsoft.Practices.EnterpriseLibrary.Data;

namespace FastFood.DataAccess
{
    public class UsuarioDalc
    {
        Database _usuarioDB;
        private UsuarioDalc() 
        {
            _usuarioDB = DatabaseFactory.CreateDatabase();
        }
        private static readonly UsuarioDalc _Instancia = new UsuarioDalc();
        public static UsuarioDalc Instancia
        {
            get { return UsuarioDalc._Instancia; }
        }

        public bool agregarUsuario(Usuarios usuario)
        {
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            {
                conexion.Open();
                using (SqlTransaction sqlTransaction = conexion.BeginTransaction())
                {
                    try
                    {
                        using (SqlCommand comando = new SqlCommand())
                        {
                            comando.CommandType = CommandType.StoredProcedure;
                            comando.CommandText = "proc_UsuariosInsert";
                            comando.Connection = conexion;
                            comando.Transaction = sqlTransaction;

                            comando.Parameters.Add("@usuarioID", SqlDbType.SmallInt).Value = usuario.usuarioID;
                            comando.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = usuario.username;
                            comando.Parameters.Add("@password", SqlDbType.NVarChar, 10).Value = usuario.password;
                            comando.Parameters.Add("@esPrincipal", SqlDbType.Bit).Value = usuario.esPrincipal;
                            comando.ExecuteNonQuery();
                        }
                        using (SqlCommand comando = new SqlCommand())
                        {
                            comando.CommandType = CommandType.StoredProcedure;
                            comando.CommandText = "proc_PermisosInsert";
                            comando.Connection = conexion;
                            comando.Transaction = sqlTransaction;

                            foreach (Permisos p in usuario.Permisos)
                            {
                                comando.Parameters.Add("@tipoPermiso", SqlDbType.TinyInt).Value = p.tipoPermiso;
                                comando.Parameters.Add("@usuarioID", SqlDbType.SmallInt).Value = usuario.usuarioID;
                                comando.Parameters.Add("@formularioID", SqlDbType.TinyInt).Value = p.formularioID;
                                comando.Parameters.Add("@estado", SqlDbType.Bit).Value = p.estado;
                                comando.ExecuteNonQuery();
                                comando.Parameters.Clear();
                            }
                        }
                        sqlTransaction.Commit();

                    }
                    catch (Exception ex)
                    {
                        sqlTransaction.Rollback();
                        throw ex;
                    }
                    finally
                    {
                        if (conexion.State == ConnectionState.Open)
                        {
                            conexion.Close();
                            conexion.Dispose();
                        }
                    }
                }
            }
            return true;


        }

        public bool modificarUsuario(Usuarios usuario)
        {
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            {
                conexion.Open();
                using (SqlTransaction sqlTransaction = conexion.BeginTransaction())
                {
                    try
                    {
                        using (SqlCommand comando = new SqlCommand())
                        {
                            comando.CommandType = CommandType.StoredProcedure;
                            comando.CommandText = "proc_UsuariosUpdate";
                            comando.Connection = conexion;
                            comando.Transaction = sqlTransaction;

                            comando.Parameters.Add("@usuarioID", SqlDbType.SmallInt).Value = usuario.usuarioID;
                            comando.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = usuario.username;
                            comando.Parameters.Add("@password", SqlDbType.NVarChar, 10).Value = usuario.password;
                            comando.Parameters.Add("@esPrincipal", SqlDbType.Bit).Value = usuario.esPrincipal;
                            comando.ExecuteNonQuery();
                        }
                        using (SqlCommand comando = new SqlCommand())
                        {
                            comando.CommandType = CommandType.StoredProcedure;
                            comando.CommandText = "proc_PermisosInsert";
                            comando.Connection = conexion;
                            comando.Transaction = sqlTransaction;

                            foreach (Permisos p in usuario.Permisos)
                            {
                                comando.Parameters.Add("@tipoPermiso", SqlDbType.TinyInt).Value = p.tipoPermiso;
                                comando.Parameters.Add("@usuarioID", SqlDbType.SmallInt).Value = usuario.usuarioID;
                                comando.Parameters.Add("@formularioID", SqlDbType.TinyInt).Value = p.formularioID;
                                comando.Parameters.Add("@estado", SqlDbType.Bit).Value = p.estado;
                                comando.ExecuteNonQuery();
                                comando.Parameters.Clear();
                            }
                        }
                        sqlTransaction.Commit();
                        
                    }
                    catch (Exception ex)
                    {
                        sqlTransaction.Rollback();
                        throw ex;
                    }
                    finally
                    {
                        if (conexion.State == ConnectionState.Open)
                        {
                            conexion.Close();
                            conexion.Dispose();
                        }
                    }
                }
            }
            return true;
        }

        public bool eliminarUsuario(short? id)
        {
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            using (SqlCommand comando = new SqlCommand("dbo.[proc_UsuariosDelete]", conexion))
            {
                try
                {
                    comando.CommandType = CommandType.StoredProcedure;
                    conexion.Open();
                    comando.Parameters.Add("@usuarioID", SqlDbType.SmallInt).Value = id;
                    
                    if (comando.ExecuteNonQuery() == 0)
                    {
                        return false;
                    }
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }

        }

        public Usuarios obtenerUsuarioPorID(short? id)
        {
            Usuarios c = null;
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            using (SqlCommand comando = new SqlCommand("dbo.[proc_UsuariosLoadByPrimaryKey]",conexion))
            {
                try
                {
                    comando.CommandType = CommandType.StoredProcedure;
                    conexion.Open();
                    comando.Parameters.Add("@usuarioID", SqlDbType.Int).Value = id;
                    
                    SqlDataReader lector = comando.ExecuteReader();
                    if (lector.Read())
                    {
                        c = new Usuarios();
                        c.usuarioID = lector.GetInt16(0);
                        c.username = lector.GetString(1);
                        c.password = lector.GetString(2);
                    }
                }
                catch (Exception)
                {
                    return null;
                }
            }
            return c;

        }

        public Usuarios ObtenerUsuario(string usuario, string pass)
        {
            Usuarios c = null;
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            using (SqlCommand comando = new SqlCommand("dbo.[proc_UsuariosLogin]", conexion))
            {
                try
                {
                    comando.CommandType = CommandType.StoredProcedure;
                    conexion.Open();
                    comando.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = usuario;
                    comando.Parameters.Add("@password", SqlDbType.NVarChar, 10).Value = pass;
                    
                    SqlDataReader lector = comando.ExecuteReader();
                    if (lector.Read())
                    {
                        c = new Usuarios();
                        c.usuarioID = lector.GetInt16(0);
                        c.username = lector.GetString(1);
                        c.password = lector.GetString(2);
                        c.esPrincipal = lector.GetBoolean(3);
                    }
                }
                catch (Exception)
                {
                    return null;
                }
            }
            return c;
        }


        public List<Usuarios> listarUsuario()
        {
            List<Usuarios> lista = new List<Usuarios>();
            Usuarios c = null;
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            using (SqlCommand comando = new SqlCommand("[proc_UsuariosLoadAll]", conexion))
            {
                try
                {
                    conexion.Open();

                    SqlDataReader lector = comando.ExecuteReader();
                    while (lector.Read())
                    {
                        c = new Usuarios();
                        c.usuarioID = lector.GetInt16(0);
                        c.username = lector.GetString(1);
                        c.password = lector.GetString(2);
                        c.esPrincipal = lector.GetBoolean(3);
                        lista.Add(c);
                    }
                    lector.Close();

                }
                catch (Exception)
                {
                    return null;
                }
            }
            return lista;

        }

        public List<Permisos> ObtenerPermisosPorUsuarioAndFormulario(short idUsuario, byte idFormulario)
        {
            List<Permisos> lista = new List<Permisos>();
            Permisos c = null;
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            using (SqlCommand comando = new SqlCommand("proc_PermisosPorUsuarioAndFormulario", conexion))
            {
                try
                {
                    comando.CommandType = CommandType.StoredProcedure;
                    conexion.Open();
                    comando.Parameters.Add("@usuarioID", SqlDbType.SmallInt).Value = idUsuario;
                    comando.Parameters.Add("@formularioID", SqlDbType.TinyInt).Value = idFormulario;

                    SqlDataReader lector = comando.ExecuteReader();
                    while (lector.Read())
                    {
                        c = new Permisos();
                        c.tipoPermiso = lector.GetByte(0);
                        c.estado = lector.GetBoolean(3);
                        lista.Add(c);
                    }
                    lector.Close();

                }
                catch (Exception)
                {
                    return null;
                }
            }
            return lista;
        }

        public List<Permisos> ObtenerPermisosByUsuarioAndMenuAndAcceso(short idUsuario, byte idMenu)
        {
            List<Permisos> lista = new List<Permisos>();
            Permisos c = null;
            using (SqlConnection conexion = new SqlConnection(Conexion.Instancia.CadenaConexion()))
            using (SqlCommand comando = new SqlCommand("proc_PermisosByUsuarioAndMenuAndAcceso", conexion))
            {
                try
                {
                    comando.CommandType = CommandType.StoredProcedure;
                    conexion.Open();
                    comando.Parameters.Add("@usuarioID", SqlDbType.SmallInt).Value = idUsuario;
                    comando.Parameters.Add("@menuID", SqlDbType.TinyInt).Value = idMenu;

                    SqlDataReader lector = comando.ExecuteReader();
                    while (lector.Read())
                    {
                        c = new Permisos();
                        c.tipoPermiso = lector.GetByte(0);
                        c.estado = lector.GetBoolean(3);
                        lista.Add(c);
                    }
                    lector.Close();

                }
                catch (Exception)
                {
                    return null;
                }
            }
            return lista;
        }

    }
}
